package com.zhny.sensor.nio;

import com.zhny.sensor.utils.ByteUtils;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufUtil;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Hex;

import java.io.RandomAccessFile;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.Scanner;

/**
 * @Auther: zhy
 * @Date: 2019/11/14
 * @Description:
 */
public class ClientHandler extends SimpleChannelInboundHandler<ByteBuf> {

    @Override
    //客户端连接服务器后被调用
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("客户端已连接服务器.....");

        long start = System.currentTimeMillis();

//
//        System.out.println("开始时间：" + start);
//        byte[] req = buildLoginTestPackage();
//        Scanner sc=new Scanner(System.in);
//        ByteBuf firstMessage = Unpooled.buffer(req.length);//发送类
//        firstMessage.writeBytes(req);
//        ctx.writeAndFlush(firstMessage);//发送flush

//
//        String ss = ByteUtils.bytesToHexString(number8());
//        System.out.println("发送的请求为"+ss);
//        ss = ss.replace(" ", "");
//        byte[] req = Hex.decodeHex(ss);
//        System.out.println("开始时间：" + start);
//        ByteBuf firstMessage = Unpooled.buffer(req.length);//发送类
//        firstMessage.writeBytes(req);
//        ctx.writeAndFlush(firstMessage);//发送flush

        //这里是通过向控制台输入一串指令
//        Scanner sc=new Scanner(System.in);
//        for (int i = 0; i < 1; i++) {
//            String ss = sc.nextLine();
//            ss = ss.replace(" ", "");
//            byte[] req = Hex.decodeHex(ss);
//            System.out.println("开始时间：" + start);
//            ByteBuf firstMessage = Unpooled.buffer(req.length);//发送类
//            firstMessage.writeBytes(req);
//            ctx.writeAndFlush(firstMessage);//发送flush
//        }

//
        byte[] bytes = buildDataReportTestPackage();
        System.out.println("开始时间：" + start);
        ByteBuf firstMessage = Unpooled.buffer(bytes.length);//发送类
        firstMessage.writeBytes(bytes);
        ctx.writeAndFlush(firstMessage);//发送flush

//

//        sc.close();

    }


    //从服务器接收到数据后调用
    @Override
    protected void channelRead0(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf) throws Exception {
        System.out.println("客户端正在接受数据.....");
        // 服务端返回消息后
        ByteBuf buf = byteBuf;
        byte[] response = new byte[buf.readableBytes()];
        buf.readBytes(response);

        // 固件接收测试
//        RandomAccessFile randomAccessFile = new RandomAccessFile("C:\\Users\\ASUS\\Desktop\\test.log","rw");
//        randomAccessFile.write(response);

        System.out.println("服务端发送数据 :" + ByteBufUtil.hexDump(response));
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        // 关闭通道
        cause.printStackTrace();
        ctx.close();
        System.out.println("客户端捕获异常.....");
    }


    //帧代号为05的测试   88 FB
    //                  00 1D
    //                  05
    //                  03 03 03 03 03 03
    //                  00 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 00 00 00
    //                  8B A9
    //                  FC FC
    //88 FB 00 1D 05 03 03 03 03 03 03 00 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 00 00 00 8B A9 FC FC
    /**
     * 创建登录测试数据包
     *
     * @return
     */
    public byte[] buildLoginTestPackage() throws DecoderException {
        // 登录数据
        byte[] req = new byte[]{
                (byte) 0x88, (byte) 0xFB, // 帧头
                (byte) 0x00, (byte) 0x29, // 帧长度 41
                (byte) 0x01, // 帧代号
                (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x01, (byte) 0x01, // 地址段
                (byte) 0x00, // 软件版本号：0x00~0xFF(最多256个版本)
                (byte) 0x00, // 硬件版本号：0x00~0xFF(最多256个版本)
                (byte) 0x61, (byte) 0x01, (byte) 0x61, (byte) 0x01, // 用户信息更新日期（年月日时）
                (byte) 0x31, (byte) 0x31, (byte) 0x33, (byte) 0x32, (byte) 0x35, (byte) 0x2e, (byte) 0x36, (byte) 0x36, (byte) 0x35, (byte) 0x37, // 经度 11325.6657
                (byte) 0x30, (byte) 0x32, (byte) 0x32, (byte) 0x33, (byte) 0x32, (byte) 0x2e, (byte) 0x38, (byte) 0x31, (byte) 0x33, (byte) 0x31, // 纬度 02232.8131
            //原来的    (byte) 0xbb, (byte) 0x75, // CRC校验
                (byte) 0x75, (byte) 0xBB, // CRC校验
                (byte) 0xFC, (byte) 0xFC // 结尾帧
        };


//        String ss = "88 fb fa 2b 43 61 01 50 11 00 00 02 00 03 14 01 07 12 1d 18 00 00 01 2c 00 00 01 2c 00 00 01 2c 1f 00 02 82 36 00 00 07 d0 45 7f d9 71 a7 a6 fc fc";
        //1111111错误示例
//        String ss = "88 fb 00 0a 06 00 00 00 92 98 fc fc";
//        String ss = "88 fb 90 91 01 fc fc";
//        String ss = "88 FB 00 02 02 03 03 03 03 03 03 00 00 2C 79 FC FC";
// 用来测试   String ss = "88 FB 00 25 01 03 03 03 03 03 03 00 00 00 01 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 29 B6 FC FC"; F8A6
//        String ss = "88 fb" +
//                " 00 25 " +
//                "01" +
//                " 03 03 03 03 03 03 " +
//                "01 01 02 02 02 02" +
//                " 00 00 00 00 00 00 00 00 00 00" +
//                " 00 00 00 00 00 00 00 00 00 00 " +
//                "57 a7 fc fc";

//
//        ss = ss.replace(" ", "");
//        byte[] bs = Hex.decodeHex(ss);


        return req;
    }


    /**
     * 创建用户更新请求测试数据包
     *
     * @return
     */
    public byte[] buildUserUpdateTestPackage() {
        // 用户数据更新请求
        byte[] req = new byte[]{
                (byte) 0x88, (byte) 0xFB, // 帧头
                (byte) 0x00, (byte) 0x11, // 帧长度
                (byte) 0x02, // 帧代号
                (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x01, (byte) 0x01, // 地址段
                (byte) 0x00, (byte) 0x00, // 用户信息更新版本号
                (byte) 0x22, (byte) 0x28, // CRC校验
                (byte) 0xFC, (byte) 0xFC // 结尾帧
        };
        return req;
    }


    /**
     * 创建禽类品种信息更新请求测试数据包
     *88 FB 00 11 03 00 00 00 01 01 01 00 00 2f b8 fc fc
     * 88 fb 00 0b 03 03 03 03 03 03 03 00 00 93 a4 fc fc
     * @return  030303030303
     */
    public byte[] buildPoultryCategoryUpdateTestPackage() {
        // 用户数据更新请求
        byte[] req = new byte[]{
                (byte) 0x88, (byte) 0xFB, // 帧头
                (byte) 0x00, (byte) 0x11, // 帧长度
                (byte) 0x03, // 帧代号
                //(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x01, (byte) 0x01, // 地址段
                (byte) 0x03, (byte) 0x03, (byte) 0x03, (byte) 0x03, (byte) 0x03, (byte) 0x03, // 地址段
                (byte) 0x00, (byte) 0x00, // 家禽信息更新版本号
                (byte) 0x26, (byte) 0x85, // CRC校验
                (byte) 0xFC, (byte) 0xFC // 结尾帧
        };
        return req;
    }


    /**
     * 创建禽心跳请求测试数据包
     *88 FB 00 12 06 00 00 00 01 01 01 23 02 10 17 EE FC FC
     * @return
     */
    public byte[] buildHeartBeatTestPackage() {
        // 用户数据更新请求
        byte[] req = new byte[]{
                (byte) 0x88, (byte) 0xFB, // 帧头
                (byte) 0x00, (byte) 0x12, // 帧长度
                (byte) 0x06, // 帧代号
                (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x01, (byte) 0x01, // 地址段
                (byte) 0x23, // 状态码 0x00：无故障 0x01：卡纸 0x23：缺纸：0x24
                (byte) 0x02, (byte) 0x10, // 条码剩余量 528
                (byte) 0x17, (byte) 0xee, // CRC校验
                (byte) 0xFC, (byte) 0xFC // 结尾帧
        };
        return req;
    }


    /**
     * 创建上报采集数据请求测试数据包
     *
     * @return
     */
    public byte[] buildDataReportTestPackage() {
        // 用户数据更新请求
        byte[] req = new byte[]{
                (byte) 0x88, (byte) 0xFB, // 帧头
                (byte) 0x00, (byte) 0x43, // 帧长度 67
                (byte) 0x07, // 帧代号
//                (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x01, (byte) 0x01, // 地址段
                (byte) 0x03, (byte) 0x03, (byte) 0x03, (byte) 0x03, (byte) 0x03, (byte) 0x03, // 地址段
                // 数据段：条码信息 16字节 + 8字节（0xFF预留）
                (byte) 0x01, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
                // 数据段：家禽种类 2字节(大类编号） + 4字节（细类编号） 1001：03e9
                (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x03, (byte) 0xe9,
                // 数据段：市场去向 20个字节
                (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x03,
                // 数据段：6 Byte[年月日时分秒]
                (byte) 0x13, (byte) 0x0b, (byte) 0x18, (byte) 0x15, (byte) 0x03, (byte) 0x01,
                // 数据段：条码剩余量
                (byte) 0x01, (byte) 0x00,
                (byte) 0x49, (byte) 0x2f, // CRC校验
                (byte) 0xFC, (byte) 0xFC // 结尾帧
        };
        return req;
    }


    /**
     * 创建上报采集数据请求测试数据包
     *
     * @return
     */
    public byte[] buildSubPoultryCategoryUpdateTestPackage() {
        // 用户数据更新请求
        byte[] req = new byte[]{
                (byte) 0x88, (byte) 0xFB, // 帧头
                (byte) 0x00, (byte) 0x0c, // 帧长度 12
                (byte) 0x09, // 帧代号
                (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x01, (byte) 0x01, // 地址段
                (byte) 0x00, // 家禽大类编号
                (byte) 0xb4, (byte) 0xc1, // CRC校验
                (byte) 0xFC, (byte) 0xFC // 结尾帧
        };
        return req;
    }


    /**
     * 创建程序更新请求测试数据包
     *
     * @return
     */
    public byte[] buildProgramUpdateTestPackage() {
        // 用户数据更新请求
        byte[] req = new byte[]{
                (byte) 0x88, (byte) 0xFB, // 帧头
                (byte) 0x00, (byte) 0x0c, // 帧长度 12
                (byte) 0x04, // 帧代号
                (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x01, (byte) 0x01, // 地址段
                (byte) 0x00, // 固件版本号
                (byte) 0x75, (byte) 0x58, // CRC校验
                (byte) 0xFC, (byte) 0xFC // 结尾帧
        };
        return req;
    }

    /**
     * 创建程序更新请求测试数据包
     *
     * @return
     */
    public byte[] buildfirmwareUpdateTestPackage() {
        // 用户数据更新请求
        byte[] req = new byte[]{
                (byte) 0x88, (byte) 0xFB, // 帧头
                (byte) 0x00, (byte) 0x0c, // 帧长度 12
                (byte) 0x0a, // 帧代号
                (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x01, (byte) 0x01, // 地址段
                (byte) 0x00, // 固件版本号
                (byte) 0x00, (byte) 0x00, // 固件包总数
                (byte) 0x00, (byte) 0x01, // 当前更新的包序号 从1开始
                (byte) 0xb3, (byte) 0xc8, // CRC校验
                (byte) 0xFC, (byte) 0xFC // 结尾帧
        };
        return req;
    }
    /**
     * 作者 minxin
     */
    public byte[] number8() {
        // 用户数据更新请求
        byte[] req = new byte[]{
                (byte) 0x88, (byte) 0xFB, // 帧头
                (byte) 0x00, (byte) 0x0c, // 帧长度 12
                (byte) 0x08, // 帧代号
                (byte) 0x03, (byte) 0x03, (byte) 0x03, (byte) 0x03, (byte) 0x03, (byte) 0x03, // 地址段
                (byte) 0x00, // 家禽大类序号
                (byte) 0x26, (byte) 0xa3, // CRC校验
                (byte) 0xFC, (byte) 0xFC // 结尾帧
        };
        return req;
    }
//88 fb 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 ae af fc fc
//88 fb 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 AE 7F fc fc
//帧头+数据包+crc校验码+帧尾
//胡工发的就是数据包而已
}
